#include <stdio.h>
#include <stdlib.h>

typedef struct linknode
{
	int data;
	struct linknode *next;
}link_node;


int headinsert(link_node *H,int a);
int view(link_node *H);
int modpos(link_node *H,link_node *P);
link_node * releselink(link_node *H);
int returnlink(link_node *H);


int flag=0;

int main(int argc, const char *argv[])
{
	link_node *H=(link_node *)malloc(sizeof(link_node));
	H->data=0;
	H->next=NULL;
	int inputnum=0;
	for(int i=0;i<5;i++)
	{
		printf(">>>plz input 5 nums (%d)\n",i+1);
		scanf("%d",&inputnum);
		headinsert(H,inputnum);
	}
	//view(H);
	printf("**1**\n");
	link_node *A=releselink(H);
	printf("**2**\n");
	//view(H);
	returnlink(A);
	//view(A);
	printf("**3**\n");
	modpos(H,A);
	printf("**4**\n");
	view(H);
	
	return 0;
}

int headinsert(link_node *H,int a)
{
	link_node *p=(link_node *)malloc(sizeof(link_node));	
	p->data=a;
	p->next=H->next;
	H->next=p;

	return 0;
}

int view(link_node *H)
{
	link_node *p=H;
	while(p->next!=NULL)
	{
		p=p->next;
		printf(">>>>>>>>>>>>>***%d\n",p->data);
	}

	return 0;
}

int modpos(link_node *H,link_node *P)
{
	link_node *l=H;
	link_node *q=P->next;
	int takenode=flag/2;
	int k=0;
	int j=0;
	if(flag%2==1)
	{
		takenode++;
	}
	else if(flag==1)
	{
		takenode=0;
	}
	for(int i=1;i<takenode+1;i++)
	{
		j=2*i-1;
		
		for(k=0;k<j;k++)
		{
			l=l->next;	
			printf("====1.====\n");
		}
		
		P->next=q->next;
		q->next=l->next;
		l->next=q;

		q=P->next;
		l=H;
		printf("============\n");
		view(H);
	}

	return 0; 
}
link_node * releselink(link_node *H)
{
	link_node *p=H;
	int i=0;
	while(p->next!=NULL)
	{
		p=p->next;
		i++;
	}
	flag=i/2;
	if(i%2==1)
	{
		flag++;
	}
	p=H;
	link_node *q=(link_node *)malloc(sizeof(link_node));
	q->data=0;
	q->next=NULL;

	for(int k=0;k<flag;k++)
	{
		p=p->next;
	}
	q->next=p->next;
	p->next=NULL;
	view(H);

	return q;
}

int returnlink(link_node *H)
{

	//view(H);
	link_node *D=H;
	link_node *p=H->next;
	link_node *q=H->next->next;
	

	while(q!=NULL)
	{
		p->next=q->next;
		q->next=D->next;
		D->next=q;
		q=p->next;
	}
	view(H);
	return 0;
}

